package com.dineroquegastar.urule.utils;

import com.dineroquegastar.urule.constant.RespEnum;
import com.dineroquegastar.urule.exception.BusinessException;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Collection;


/**
 * Created by liuhai on 2019/9/14.
 */
public final class CommonPreconditions {

    private CommonPreconditions() {
    }

    /**
     * 校验为true
     *
     * @param expression   当值为false时抛出异常
     * @param errorCode    错误码
     * @param errorMessage 校验失败提示信息
     * @throws BusinessException if {@code expression} is false
     */
    public static void checkTrue(boolean expression, String errorCode, Object errorMessage) {
        if (!expression) {
            throw new BusinessException(errorCode, String.valueOf(errorMessage));
        }
    }

    /**
     * 校验为true 返回默认系统失败的错误码
     *
     * @param expression
     * @param errorMessage
     */
    public static void checkTrue(boolean expression, Object errorMessage) {
        checkTrue(expression, RespEnum.SYS_ERR.getCode(), errorMessage);
    }

    /**
     * 校验为true 返回默认系统失败的错误码
     *
     * @param expression
     * @param errorMessageTemplate
     * @param errorMessageArgs
     */
    public static void checkTrue(boolean expression, String errorMessageTemplate, Object... errorMessageArgs) {
        checkTrue(expression, RespEnum.SYS_ERR.getCode(), String.format(errorMessageTemplate, errorMessageArgs));
    }

    /**
     * 校验为true
     *
     * @param expression           当值为false时抛出异常
     * @param errorCode            错误码
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code expression} is false
     */
    public static void checkTrue(boolean expression, String errorCode, String errorMessageTemplate, Object... errorMessageArgs) {
        if (!expression) {
            throw new BusinessException(errorCode, String.format(errorMessageTemplate, errorMessageArgs));
        }
    }


    /**
     * 校验为null
     *
     * @param object               当值不为null时抛出异常
     * @param errorCode            异常错误码
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code object} is not null
     */
    public static void checkNull(Object object, String errorCode, String errorMessageTemplate, Object... errorMessageArgs) {
        if (object != null) {
            throw new BusinessException(errorCode, String.format(errorMessageTemplate, errorMessageArgs));
        }
    }

    /**
     * 校验不为null
     *
     * @param object       当值为null时抛出异常
     * @param errorCode    异常错误码
     * @param errorMessage 校验失败提示信息
     * @throws BusinessException if {@code object} is null
     */
    public static <T> T checkNotNull(T object, String errorCode, Object errorMessage) {
        if (object == null) {
            throw new BusinessException(errorCode, String.valueOf(errorMessage));
        } else {
            return object;
        }
    }

    /**
     * 校验不为null
     *
     * @param object       当值为null时抛出异常
     * @param errorMessage 校验失败提示信息
     * @throws BusinessException if {@code object} is null
     */
    public static <T> T checkNotNull(T object, Object errorMessage) {
        if (object == null) {
            throw new BusinessException(RespEnum.SYS_ERR.getCode(), String.valueOf(errorMessage));
        } else {
            return object;
        }
    }


    /**
     * 校验不为null
     *
     * @param object               当值为null时抛出异常
     * @param errorCode            异常错误码
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code object} is null
     */
    public static <T> T checkNotNull(T object, String errorCode, String errorMessageTemplate, Object... errorMessageArgs) {
        if (object == null) {
            throw new BusinessException(errorCode, String.format(errorMessageTemplate, errorMessageArgs));
        } else {
            return object;
        }
    }

    /**
     * 校验不为null
     *
     * @param object               当值为null时抛出异常
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code object} is null
     */
    public static <T> T checkNotNull(T object, String errorMessageTemplate, Object... errorMessageArgs) {
        if (object == null) {
            throw new BusinessException(RespEnum.SYS_ERR.getCode(), String.format(errorMessageTemplate, errorMessageArgs));
        } else {
            return object;
        }
    }


    /**
     * 校验集合不为Empty
     *
     * @param collection           当值为null时抛出异常
     * @param errorCode            异常错误码
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code object} is null
     */
    public static void checkNotEmpty(Collection collection, String errorCode, String errorMessageTemplate, Object... errorMessageArgs) {
        if (collection == null || collection.isEmpty()) {
            throw new BusinessException(errorCode, String.format(errorMessageTemplate, errorMessageArgs));
        }
    }

    /**
     * 校验集合不为Empty
     *
     * @param str                  当字符串值为null和""时抛出异常
     * @param errorCode            异常错误码
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code object} is null
     */
    public static String checkStringNotEmpty(String str, String errorCode, String errorMessageTemplate, Object... errorMessageArgs) {
        if (StringUtils.isBlank(str)) {
            throw new BusinessException(errorCode, String.format(errorMessageTemplate, errorMessageArgs));
        }
        return str;
    }

    /**
     * 校验BigDecimal数据非空且参数大于0
     *
     * @param num                  当值为为空时抛出异常 当值小于等于0时抛出异常
     * @param errorCode            错误码
     * @param errorMessageTemplate 提示信息模板：第一个 {@code %s} 对应 {@code errorMessageArgs[0]}, etc
     * @param errorMessageArgs     模板参数
     * @throws BusinessException if {@code expression} is false
     */
    public static void checkNumNotNullGreaterThanZero(BigDecimal num, String errorCode, String errorMessageTemplate, Object... errorMessageArgs) {

        checkNotNull(num, errorCode, errorMessageTemplate, errorMessageArgs);

        if (num.compareTo(BigDecimal.ZERO) <= 0) {
            throw new BusinessException(errorCode, String.format(errorMessageTemplate, errorMessageArgs));
        }
    }

}
